/* Représente la déclaration d'un élément :
 * <! ELEMENT ... >
 */

#ifndef _DTD_DECLARATION
#define _DTD_DECLARATION


#include "DtdNode.h"
#include "DtdComposite.h"

#include <string>
#include <set>


/* Type du noeud */
enum ElementType
{
	ELM_CHILDREN,	/* Élément avec des enfants */
	ELM_EMPTY,		/* Élément vide */
	ELM_ANY,		/* Élement avec ANY CONTENTS */
	ELM_PCDATA		/* PCDATA */
};


/* Règles utilsées pour les types des éléments :
 * On se base sur les standards de la W3C :
 * pour les éléments : http://www.w3schools.com/dtd/dtd_elements.asp
 *
 * **** elementType = CHILDREN : l'élément contient des éléments fils. tree doit
 * pointer sur un composite.
 *
 * ***** elementType = EMPTY : L'élément ne contient rien. Le contenu de tree
 * doit-être NULL.
 *
 * ***** elementType = ANY : On stocke les noeud ANY dans l'arbre, mais on ne les
 * exploite pas. tree doit-etre à NULL
 *
 * ***** elementType = PCDATA : Deux cas
 *	- si tree = NULL, alors c'est un PCDATA NON-MIXED : le noeud contient du texte.
 *	- si tree != NULL, alors c'est un PCDATA MIXED. Dans ce cas, il faut que tree pointe
 * sur un composite de type CHOIX, de cardinalité ZERO_PLUS (*).
 */
class DtdDeclaration
{
public :
	DtdDeclaration( );
	
	~DtdDeclaration();

	/* Ajoute un attribut. Renvoie true si l'ajout a été fait,
	 * false si l'attribut a pas été ajouté car il est déjà présent.
	 */
	void addAttribut(std::string &p_attr);

	/* Test si un attribut est dans le set */
	bool isAttribut(std::string &p_attr);

	/* Permet de traverser la liste des attributs */
	void setAttrItToBeg();
	const std::string& getAttrItNext();
	bool attrItContinue();

	/* TODO :
	bool checkStructure();
	*/

public :
	std::string name; /* Nom de l'élément */
	enum ElementType elementType; /* Type du noeud */
	DtdComposite *tree; /* Arbre décrivant la structure de l'élément. */

private :
	std::set<std::string> attributs; /* Liste des attributs */
	std::set<std::string>::iterator attrIt; /* Itérateurs dans les attributs */
};


#endif
